import axios from 'axios'
import store from '@/store'
import router from '@/router'

// baseURL 超时时间配置 timeout
const instance = axios.create({
  baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net'
})

// 全局注入token
// 请求拦截器
instance.interceptors.request.use(config => {
  // 统一添加token 获取token 根据后台文档添加请求头
  // 导入store 获取到token
  const { token } = store.state.user.profile
  if (token) {
    // 有token 添加请求头
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, e => Promise.reject(e))

// 处理返回数据 token失效跳回到登录页
// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    return response
  },
  (error) => {
    // token失效处理
    if (error.response && error.response.status === 401) {
      // 如果失效保存当前页面地址 下次登陆成功直接回跳到上次访问的页面
      // 获取到当前出现401的页面地址 跳到登陆页携带该路径
      // 注意VUE3 .value=> router.currentRoute.value.fullPath 获取当前访问路由对象
      // encodeURIComponent() 避免编码问题
      const currUrl = encodeURIComponent(router.currentRoute.value.fullPath)
      // 路径拼接 跳转到之前页面 replace 不保存历史记录 push 保存历史记录
      router.replace(`/login?redirectUrl=${currUrl}`)
    }
    return Promise.reject(error)
  }
)

/**
 * 二次封装instance
 * @param {*} url 请求地址
 * @param {*} method 请求方法
 * @param {*} data 请求参数
 */
const request = (url, method, data) => {
  return instance({
    url,
    method,
    // get => params | post => data
    // 判断请求方式是不是get 是 参数为params 否则为data
    // .toLowerCase() 转换为小写方便判断
    [method.toLowerCase() === 'get' ? 'params' : 'data']: data
  })
}
export default request
